/**
 * 文件操作相关方法
 * 基本上都是同步的
 */
var http = require('http');
var fs = require('fs');
var path = require("path");
var FileHelper = {
    /**
     * //检查目录或者文件是否存在(同步)
     * @param path
     * @returns {boolean}
     */
    fsExistsSync: function (path) {
        try {
            fs.accessSync(path);//或者 fs.statSync(path)
        } catch (e) {
            return false;
        }
        return true;
    },
    /**
     * 同步方法
     * 遍历文件目录, 获取一级目录下文件基本信息(除了文件内容), 不做深度遍历 -- 内部调用
     * PS:深度遍历文件的话需要在目录下递归执行,readFile(path + '/' + file, filesList);
     * @param path1
     * @param filesList:数组形式 返回路径下文件信息(文件内容除外)
     */
    _readFileSync: function (path1, filesList) {
        var files = fs.readdirSync(path1);//需要用到同步读取
        files.forEach(walk);
        function walk(file) {
            var states = fs.statSync(path.join(path1, file));
            if (states.isDirectory()) {
                //readFile(path + '/' + file, filesList); //deleted by liuxiaoxiao
                //创建一个对象保存信息
                var obj = new Object();
                obj.name = file;//文件名
                obj.path = path.join(path1, file); //文件绝对路径
                obj.isFile = false; //区分是文件还是目录
                obj.creatTime = states.birthtime;
                obj.modifyTime = states.mtime;
                filesList.push(obj);
            }
            else {
                //创建一个对象保存信息
                var obj = new Object();
                obj.size = states.size;//文件大小，以字节为单位
                obj.name = file;//文件名
                obj.path = path.join(path1, file); //文件绝对路径
                obj.isFile = true; //区分是文件还是目录
                obj.creatTime = states.birthtime;
                obj.modifyTime = states.mtime;
                filesList.push(obj);
            }
        }
    },
    /**
     * 同步方法
     * 获取指定大赛目录下文件列表, 只是一级的, 不进行深度遍历
     * @param path
     * @returns {Array}
     */
    geFileListByDirectorySync: function (path) {
        var filesList = [];
        this._readFileSync(path, filesList);
        return filesList;
    },

    /**
     * 同步方法
     * 取文件内容
     * @param filePath: 文件路径
     * @returns {{}} 文件大小和文件内容
     */
    getFileContentSync: function (filePath) {
        var fileObj = {};
        if (!filePath) {
            return fileObj;
        }
        var states = fs.statSync(path.join(filePath));
        fileObj.size = states.size;
        var fileContent = fs.readFileSync(filePath, 'utf-8');
        fileObj.content = fileContent;//.replace(/[\n\r]/g,'');//[\n\r\s]
        return fileObj;

    },
    /**
     * 同步方法
     * 写文件
     * @param filePath: 文件路径
     * @param content: 文件内容
     * @param creatFile: 如果文件不存在是否创建文件,默认为创建 true
     * @returns {bool}
     */
    writeFileSync: function (filePath, content, createFile) {
        var resObj = {
            status: 200,
            msg: '文件保存成功',
            isModify: true //标记文件是修改还是新建
        }
        if (!filePath) {
            resObj.status = 500;
            resObj.msg = '文件路径不能为空';
            return resObj;
        }
        //目录不存在的话不创建目录
        if(!this.fsExistsSync(path.dirname(filePath))) {
            resObj.status = 500;
            resObj.msg = '文件目录不存在';
            return resObj;
        }
        if (typeof createFile == 'boolean' && !createFile && !this.fsExistsSync(filePath)) {
            resObj.status = 500;
            resObj.msg = '文件不存在';
            return resObj;
        }
        if ((typeof createFile == 'boolean' && createFile) || typeof createFile == 'undefined' && !this.fsExistsSync(filePath)) {
            resObj.isModify = false;
        }
        //文件不存在的话, 会自动创建, 但是文件的目录不存在的不会自动创建, 会报错的
        fs.writeFileSync(filePath, content, 'utf-8');
        return resObj;
    },
    /**
     * 格式化文件大小, size大小字节
     * @param size: 文件大小 字节
     * @returns {string}
     */
    formatFileSize: function (size) {
        if (!size) {
            return '';
        }
        var filesize = '';
        if (size / 1024 / 1024 > 1) {
            filesize = Math.round(size / 1024 / 1024 * 100) / 100 + 'MB';
        }
        else if (size / 1024 > 1) {
            filesize = Math.round(size / 1024 * 100) / 100 + 'KB';
        }
        else {
            filesize = size + 'B';
        }
        return filesize
    }
};
module.exports = FileHelper;